package testes;

import java.util.ArrayList;
import java.util.List;

import junit.framework.Assert;

import org.junit.Before;
import org.junit.Test;

import usuarios.Endereco;
import usuarios.Pessoa;
import exceptions.pessoa.CPFInvalidoException;
import exceptions.pessoa.EmailInvalidoException;
import exceptions.pessoa.ListaEnderecoInvalidaException;
import exceptions.pessoa.NomeInvalidoException;
import exceptions.pessoa.SenhaInvalidaException;
import exceptions.pessoa.TelefoneInvalidoException;
import exceptions.pessoa.UsernameInvalidoException;
import exceptions.pessoa.endereco.BairroInvalidoException;
import exceptions.pessoa.endereco.CEPInvalidoException;
import exceptions.pessoa.endereco.LogradouroInvalidoException;
import exceptions.pessoa.endereco.NumeroInvalidoException;

@SuppressWarnings("deprecation")
public class PessoaTest {
	Pessoa ana;
	Pessoa jeh;
	Pessoa jessy;
	Endereco endereco;
	Endereco endereco2;
	Endereco endereco3;

	@Before
	public void setUp() throws Exception {
		endereco = new Endereco("Praca Clementino Procopio", "144", "Centro",
				"69100-103", true);
		endereco2 = new Endereco("Praca Clementino Procopio", "144", "Centro",
				"69100-103", false);

		List<Endereco> anaEnderecos = new ArrayList<>();
		anaEnderecos.add(endereco);
		List<Endereco> jessyEnderecos = new ArrayList<>();
		jessyEnderecos.add(endereco);
		jessyEnderecos.add(endereco2);
		ana = new Pessoa("Ana Barbosa", "045.223.566-70", "3355-0607",
				"anabarbosa@gmail.com", anaEnderecos, "aninha666", "inde22");
		jessy = new Pessoa("Jessy Barbosa", "005.023.560-01", "3223-3607",
				"jessybarbosa@gmail.com", jessyEnderecos, "jessy666", "tible22");
	}

	@Test
	public void testPessoa() throws CPFInvalidoException,
			NomeInvalidoException, TelefoneInvalidoException,
			EmailInvalidoException, SenhaInvalidaException,
			UsernameInvalidoException, ListaEnderecoInvalidaException,
			LogradouroInvalidoException, NumeroInvalidoException,
			BairroInvalidoException, CEPInvalidoException {
		endereco = new Endereco("Praca Clementino Procopio", "144", "Centro",
				"69100-103", true);
		List<Endereco> jehEnderecos = new ArrayList<>();
		jehEnderecos.add(endereco);

		// TESTE DE NOME

		try {
			jeh = new Pessoa("Jeh", "045.223.566-70", "3858-0808",
					"jehbarbosa@gmail.com", jehEnderecos, "jeh666", "minimo");
			System.out.println("Devia ter lancado excecao");
		} catch (NomeInvalidoException e) {
			Assert.assertEquals("Nome invalido. Por favor, digite novamente.",
					e.getMessage());
		}

		try {
			jeh = new Pessoa("", "045.223.566-70", "3858-0808",
					"jehbarbosa@gmail.com", jehEnderecos, "jeh666", "minimo");
			System.out.println("Devia ter lancado excecao");
		} catch (NomeInvalidoException e) {
			Assert.assertEquals("Nome invalido. Por favor, digite novamente.",
					e.getMessage());
		}

		try {
			jeh = new Pessoa(null, "045.223.566-70", "3858-0808",
					"jehbarbosa@gmail.com", jehEnderecos, "jeh666", "minimo");
			System.out.println("Devia ter lancado excecao");
		} catch (NomeInvalidoException e) {
			Assert.assertEquals("Nome invalido. Por favor, digite novamente.",
					e.getMessage());
		}

		try {
			jeh = new Pessoa("Jeh2 Barbosa", "045.223.566-70", "3858-0808",
					"jehbarbosa@gmail.com", jehEnderecos, "jeh666", "minimo");
		} catch (NomeInvalidoException e) {
			System.out.println("Nao ira aparecer esta mensagem,"
					+ " pois nao lancou excecao");
		}

		// TESTE DE CPF

		try {
			jeh = new Pessoa("Jeh Barbosa", "045.223.566-7", "3858-0808",
					"jehbarbosa@gmail.com", jehEnderecos, "jeh666", "minimo");
			System.out.println("Devia ter lancado excecao");
		} catch (CPFInvalidoException e) {
			Assert.assertEquals("CPF invalido. Por favor, digite novamente.",
					e.getMessage());
		}

		try {
			jeh = new Pessoa("Jeh Barbosa", "0452235667", "3858-0808",
					"jehbarbosa@gmail.com", jehEnderecos, "jeh666", "minimo");
			System.out.println("Devia ter lancado excecao");
		} catch (CPFInvalidoException e) {
			Assert.assertEquals("CPF invalido. Por favor, digite novamente.",
					e.getMessage());
		}

		try {
			jeh = new Pessoa("Jeh Barbosa", "", "3858-0808",
					"jehbarbosa@gmail.com", jehEnderecos, "jeh666", "minimo");
			System.out.println("Devia ter lancado excecao");
		} catch (CPFInvalidoException e) {
			Assert.assertEquals("CPF invalido. Por favor, digite novamente.",
					e.getMessage());
		}

		try {
			jeh = new Pessoa("Jeh Barbosa", null, "3858-0808",
					"jehbarbosa@gmail.com", jehEnderecos, "jeh666", "minimo");
			System.out.println("Devia ter lancado excecao");
		} catch (CPFInvalidoException e) {
			Assert.assertEquals("CPF invalido. Por favor, digite novamente.",
					e.getMessage());
		}

		try {
			jeh = new Pessoa("Jeh Barbosa", "045.223.566-70", "3858-0808",
					"jehbarbosa@gmail.com", jehEnderecos, "jeh666", "minimo");
		} catch (CPFInvalidoException e) {
			System.out.println("Nao ira aparecer esta mensagem, pois nao "
					+ "lancou excecao");
		}

		try {
			jeh = new Pessoa("Jeh Barbosa", "04522356670", "3858-0808",
					"jehbarbosa@gmail.com", jehEnderecos, "jeh666", "minimo");
		} catch (CPFInvalidoException e) {
			System.out.println("Nao ira aparecer esta mensagem, pois nao "
					+ "lancou excecao");
		}

		// TESTE DE TELEFONE

		try {
			jeh = new Pessoa("Jeh Barbosa", "045.223.566-70", "",
					"jehbarbosa@gmail.com", jehEnderecos, "jeh666", "minimo");
			System.out.println("Devia ter lancado excecao");
		} catch (TelefoneInvalidoException e) {
			Assert.assertEquals(
					"Telefone invalido. Por favor, digite novamente.",
					e.getMessage());
		}

		try {
			jeh = new Pessoa("Jeh Barbosa", "045.223.566-70", null,
					"jehbarbosa@gmail.com", jehEnderecos, "jeh666", "minimo");
			System.out.println("Devia ter lancado excecao");
		} catch (TelefoneInvalidoException e) {
			Assert.assertEquals(
					"Telefone invalido. Por favor, digite novamente.",
					e.getMessage());
		}

		try {
			jeh = new Pessoa("Jeh Barbosa", "045.223.566-70", "3858080",
					"jehbarbosa@gmail.com", jehEnderecos, "jeh666", "minimo");
			System.out.println("Devia ter lancado excecao");
		} catch (TelefoneInvalidoException e) {
			Assert.assertEquals(
					"Telefone invalido. Por favor, digite novamente.",
					e.getMessage());
		}

		try {
			jeh = new Pessoa("Jeh Barbosa", "045.223.566-70", "3858-080",
					"jehbarbosa@gmail.com", jehEnderecos, "jeh666", "minimo");
			System.out.println("Devia ter lancado excecao");
		} catch (TelefoneInvalidoException e) {
			Assert.assertEquals(
					"Telefone invalido. Por favor, digite novamente.",
					e.getMessage());
		}

		try {
			jeh = new Pessoa("Jeh Barbosa", "045.223.566-70", "3858-0808",
					"jehbarbosa@gmail.com", jehEnderecos, "jeh666", "minimo");
		} catch (TelefoneInvalidoException e) {
			System.out.println("Nao ira aparecer esta mensagem, "
					+ "pois nao lancou excecao");
		}

		try {
			jeh = new Pessoa("Jeh Barbosa", "045.223.566-70", "38580808",
					"jehbarbosa@gmail.com", jehEnderecos, "jeh666", "minimo");
		} catch (TelefoneInvalidoException e) {
			System.out.println("Nao ira aparecer esta mensagem,"
					+ "pois nao lancou excecao");
		}

		// TESTE DE EMAIL

		try {
			jeh = new Pessoa("Jeh Barbosa", "045.223.566-70", "3858-0804",
					"jehbarbosa gmail.com", jehEnderecos, "jeh666", "minimo");
			System.out.println("Devia ter lancado excecao");
		} catch (EmailInvalidoException e) {
			Assert.assertEquals(
					"O email invalido. Por favor, digite novamente.",
					e.getMessage());
		}

		try {
			jeh = new Pessoa("Jeh Barbosa", "045.223.566-70", "3858-0804",
					"jehbarbosa@gmail.c", jehEnderecos, "jeh666", "minimo");
			System.out.println("Devia ter lancado excecao");
		} catch (EmailInvalidoException e) {
			Assert.assertEquals(
					"O email invalido. Por favor, digite novamente.",
					e.getMessage());
		}

		try {
			jeh = new Pessoa("Jeh Barbosa", "045.223.566-70", "3858-0804",
					"jehbarbosa@gmail", jehEnderecos, "jeh666", "minimo");
			System.out.println("Devia ter lancado excecao");
		} catch (EmailInvalidoException e) {
			Assert.assertEquals(
					"O email invalido. Por favor, digite novamente.",
					e.getMessage());
		}

		try {
			jeh = new Pessoa("Jeh Barbosa", "045.223.566-70", "3858-0804", "",
					jehEnderecos, "jeh666", "minimo");
			System.out.println("Devia ter lancado excecao");
		} catch (EmailInvalidoException e) {
			Assert.assertEquals(
					"O email invalido. Por favor, digite novamente.",
					e.getMessage());
		}

		try {
			jeh = new Pessoa("Jeh Barbosa", "045.223.566-70", "3858-0804",
					null, jehEnderecos, "jeh666", "minimo");
			System.out.println("Devia ter lancado excecao");
		} catch (EmailInvalidoException e) {
			Assert.assertEquals(
					"O email invalido. Por favor, digite novamente.",
					e.getMessage());
		}

		try {
			jeh = new Pessoa("Jeh Barbosa", "045.223.566-70", "3858-0804",
					"jehbarbosa", jehEnderecos, "jeh666", "minimo");
			System.out.println("Devia ter lancado excecao");
		} catch (EmailInvalidoException e) {
			Assert.assertEquals(
					"O email invalido. Por favor, digite novamente.",
					e.getMessage());
		}

		try {
			jeh = new Pessoa("Jeh Barbosa", "045.223.566-70", "3858-0804",
					"jehbarbosa@gmail.com", jehEnderecos, "jeh666", "minimo");
		} catch (EmailInvalidoException e) {
			System.out.println("Esta mensagem nao ira aparecer, pois nao"
					+ " lancou excecao.");
		}

		// TESTE DE ENDERECOS

		List<Endereco> jehEnderecos2 = new ArrayList<>();
		jehEnderecos2.add(endereco2);

		try {
			jeh = new Pessoa("Jeh Barbosa", "045.223.566-70", "3858-0804",
					"jehbarbosa@gmail.com", jehEnderecos2, "jeh666", "minimo");
			System.out.println("Devia ter lancado excecao");
		} catch (ListaEnderecoInvalidaException e) {
			Assert.assertEquals(
					"Endereço invalido. Voce deve inserir no minimo um endereco principal.", e.getMessage());
		}

		jehEnderecos2.remove(endereco2);
		try {
			jeh = new Pessoa("Jeh Barbosa", "045.223.566-70", "3858-0804",
					"jehbarbosa@gmail.com", jehEnderecos2, "jeh666", "minimo");
			System.out.println("Devia ter lancado excecao");
		} catch (ListaEnderecoInvalidaException e) {
			Assert.assertEquals(
					"Endereço invalido. Voce deve inserir no minimo um endereco principal.",
					e.getMessage());
		}

		jehEnderecos2.add(endereco2);
		try {
			jeh = new Pessoa("Jeh Barbosa", "045.223.566-70", "3858-0804",
					"jehbarbosa@gmail.com", jehEnderecos2, "jeh666", "minimo");
			System.out.println("Devia ter lancado excecao");
		} catch (ListaEnderecoInvalidaException e) {
			Assert.assertEquals(
					"Endereço invalido. Voce deve inserir no minimo um endereco principal.",
					e.getMessage());
		}

		jehEnderecos2.add(0, endereco);
		try {
			jeh = new Pessoa("Jeh Barbosa", "045.223.566-70", "3858-0804",
					"jehbarbosa@gmail.com", jehEnderecos2, "jeh666", "minimo");
		} catch (ListaEnderecoInvalidaException e) {
			System.out.println("Nao ira aparecer essa mensagem, pois"
					+ " nao ira lancar excecao.");
		}

		// TESTE DE USERNAME

		try {
			jeh = new Pessoa("Jeh Barbosa", "045.223.566-70", "3858-0808",
					"jehbarbosa@gmail.com", jehEnderecos, null, "minimo");
			System.out.println("Devia ter lancado excecao");
		} catch (UsernameInvalidoException e) {
			Assert.assertEquals("O username nao pode ser nulo e deve conter "
					+ "no minimo 6 caracteres.", e.getMessage());
		}

		try {
			jeh = new Pessoa("Jeh Barbosa", "045.223.566-70", "3858-0808",
					"jehbarbosa@gmail.com", jehEnderecos, "jeh66", "minimo");
			System.out.println("Devia ter lancado excecao");
		} catch (UsernameInvalidoException e) {
			Assert.assertEquals("O username nao pode ser nulo e deve conter "
					+ "no minimo 6 caracteres.", e.getMessage());
		}

		try {
			jeh = new Pessoa("Jeh Barbosa", "045.223.566-70", "3858-0808",
					"jehbarbosa@gmail.com", jehEnderecos, "", "minimo");
			System.out.println("Devia ter lancado excecao");
		} catch (UsernameInvalidoException e) {
			Assert.assertEquals("O username nao pode ser nulo e deve conter "
					+ "no minimo 6 caracteres.", e.getMessage());
		}

		try {
			jeh = new Pessoa("Jeh Barbosa", "045.223.566-70", "3858-0808",
					"jehbarbosa@gmail.com", jehEnderecos, "jeh666", "minimo");
		} catch (UsernameInvalidoException e) {
			System.out.println("Nao ira aparecer esta mensagem, pois "
					+ "nao lancou excecao");
		}

		// TESTE DE SENHA
		try {
			jeh = new Pessoa("Jeh Barbosa", "045.223.566-70", "3858-0808",
					"jehbarbosa@gmail.com", jehEnderecos, "jeh666", "insuf");
			System.out.println("Devia ter lancado excecao");
		} catch (SenhaInvalidaException e) {
			Assert.assertEquals("A senha nao pode ser nula, nao pode"
					+ " ser igual ao username e deve conter no minimo 6"
					+ " caracteres.", e.getMessage());
		}

		try {
			jeh = new Pessoa("Jeh Barbosa", "045.223.566-70", "3858-0808",
					"jehbarbosa@gmail.com", jehEnderecos, "jeh666", null);
			System.out.println("Devia ter lancado excecao");
		} catch (SenhaInvalidaException e) {
			Assert.assertEquals("A senha nao pode ser nula, nao pode"
					+ " ser igual ao username e deve conter no minimo"
					+ " 6 caracteres.", e.getMessage());
		}

		try {
			jeh = new Pessoa("Jeh Barbosa", "045.223.566-70", "3858-0808",
					"jehbarbosa@gmail.com", jehEnderecos, "jeh666", "");
			System.out.println("Devia ter lancado excecao");
		} catch (SenhaInvalidaException e) {
			Assert.assertEquals("A senha nao pode ser nula, nao pode"
					+ " ser igual ao username e deve conter no minimo"
					+ " 6 caracteres.", e.getMessage());
		}

		try {
			jeh = new Pessoa("Jeh Barbosa", "045.223.566-70", "3858-0808",
					"jehbarbosa@gmail.com", jehEnderecos, "jeh666", "jeh666");
			System.out.println("Devia ter lancado excecao");
		} catch (SenhaInvalidaException e) {
			Assert.assertEquals("A senha nao pode ser nula, nao pode"
					+ " ser igual ao username e deve conter no minimo"
					+ " 6 caracteres.", e.getMessage());
		}

		try {
			jeh = new Pessoa("Jeh Barbosa", "045.223.566-70", "3858-0808",
					"jehbarbosa@gmail.com", jehEnderecos, "jeh666",
					"suficiente");
		} catch (SenhaInvalidaException e) {
			System.out.println("Nao ira aparecer esta mensagem, pois"
					+ " nao lancou excecao.");
		}
	}

	/**
	 * Testa o get de Nome.
	 */

	@Test
	public void testGetNome() {
		Assert.assertEquals("Ana Barbosa", ana.getNome());
		Assert.assertEquals("Jessy Barbosa", jessy.getNome());
	}

	/**
	 * Testa o set de Nome.
	 */

	@Test
	public void testSetNome() {
		ana.setNome("Jessy Barbosa");
		jessy.setNome("Ana Barbosa");
		Assert.assertEquals("Jessy Barbosa", ana.getNome());
		Assert.assertEquals("Ana Barbosa", jessy.getNome());
	}

	/**
	 * Testa o get de CPF.
	 */

	@Test
	public void testGetCpf() {
		Assert.assertEquals("045.223.566-70", ana.getCpf());
		Assert.assertEquals("005.023.560-01", jessy.getCpf());
	}

	/**
	 * Testa o set de CPF.
	 */

	@Test
	public void testSetCpf() {
		ana.setCpf("005.023.560-01");
		jessy.setCpf("045.223.566-70");
		Assert.assertEquals("005.023.560-01", ana.getCpf());
		Assert.assertEquals("045.223.566-70", jessy.getCpf());
	}

	/**
	 * Testa o get de Telefone.
	 */

	@Test
	public void testGetTelefone() {
		Assert.assertEquals("3355-0607", ana.getTelefone());
		Assert.assertEquals("3223-3607", jessy.getTelefone());
	}

	/**
	 * Testa o set de Telefone.
	 */

	@Test
	public void testSetTelefone() {
		ana.setTelefone("3223-3607");
		jessy.setTelefone("3355-0607");
		Assert.assertEquals("3223-3607", ana.getTelefone());
		Assert.assertEquals("3355-0607", jessy.getTelefone());
	}

	/**
	 * Testa o get de Email.
	 */

	@Test
	public void testGetEmail() {
		Assert.assertEquals("anabarbosa@gmail.com", ana.getEmail());
		Assert.assertEquals("jessybarbosa@gmail.com", jessy.getEmail());
	}

	/**
	 * Testa o set de Email.
	 */

	@Test
	public void testSetEmail() {
		ana.setEmail("jessybarbosa@gmail.com");
		jessy.setEmail("anabarbosa@gmail.com");
		Assert.assertEquals("jessybarbosa@gmail.com", ana.getEmail());
		Assert.assertEquals("anabarbosa@gmail.com", jessy.getEmail());
	}

	/**
	 * Testa o get de Enderecos.
	 */

	@Test
	public void testGetEnderecos() {
		Assert.assertEquals(true, ana.getEnderecos().get(0).isPrincipal());
		Assert.assertEquals(true, jessy.getEnderecos().get(0).isPrincipal());
	}

	/**
	 * Testa o get de Username.
	 */

	@Test
	public void testGetUsername() {
		Assert.assertEquals("aninha666", ana.getUsername());
		Assert.assertEquals("jessy666", jessy.getUsername());
	}

	/**
	 * Testa o set de Username.
	 */

	@Test
	public void testSetUsername() {
		ana.setUsername("jessy666");
		jessy.setUsername("aninha666");
		Assert.assertEquals("jessy666", ana.getUsername());
		Assert.assertEquals("aninha666", jessy.getUsername());
	}

	/**
	 * Testa o get de Senha.
	 */

	@Test
	public void testGetSenha() {
		Assert.assertEquals("inde22", ana.getSenha());
		Assert.assertEquals("tible22", jessy.getSenha());
	}

	/**
	 * Testa o set de Senha.
	 */

	@Test
	public void testSetSenha() {
		ana.setSenha("tible22");
		jessy.setSenha("inde22");
		Assert.assertEquals("tible22", ana.getSenha());
		Assert.assertEquals("inde22", jessy.getSenha());
	}

	/**
	 * Testa se o endereco esta sendo adicionado na lista de enderecos.
	 */

	@Test
	public void testAdicionaEndereco() {
		Assert.assertEquals(false, ana.adicionaEndereco(null));
		Assert.assertEquals(true, ana.adicionaEndereco(endereco));
		Assert.assertEquals(false, jessy.adicionaEndereco(null));
		Assert.assertEquals(true, jessy.adicionaEndereco(endereco));
	}

	/**
	 * Testa se o endereco escolhido sera removido da lista de enderecos.
	 */

	@Test
	public void testRemoveEndereco() {
		Assert.assertEquals(true, ana.removeEndereco("69100-103"));
		Assert.assertEquals(true, jessy.removeEndereco("69100-103"));
		Assert.assertEquals(false, ana.removeEndereco("69100"));
		Assert.assertEquals(false, jessy.removeEndereco("69100-100"));
		Assert.assertEquals(false, ana.removeEndereco(null));
		Assert.assertEquals(false, jessy.removeEndereco(null));
	}
}